package com.yaoyong.codegenerator.utils;

import com.yaoyong.codegenerator.constant.Placeholder;
import com.yaoyong.codegenerator.entity.Database;
import com.yaoyong.codegenerator.entity.Table;
import com.yaoyong.codegenerator.entity.Template;
import com.yaoyong.codegenerator.properties.PathProperties;
import com.yaoyong.codegenerator.properties.ProjectProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @author 姚勇
 */
public class CodeUtil {

    @Autowired
    private PathProperties pathProperties;
    @Autowired
    private ProjectProperties projectProperties;

    /**
     * 生产代码
     *
     * @param database
     */
    public void createCode(Database database) {
        createCode(pathProperties, projectProperties, database);
    }


    /**
     * 生产代码
     *
     * @param project
     * @param path
     * @param database
     */
    public static void createCode(PathProperties path, ProjectProperties project, Database database) {

        // 得到所有表
        List<Table> tables = database.getTables();
        /*如果表级模板路径,列级模板路径,项目级模板路径不存在,根据基础模板路径自动创建*/
        String tableTemplatePath = path.getTableTemplatePath();
        if (!StringUtils.hasLength(tableTemplatePath)){
            tableTemplatePath = path.getBaseTemplatePath() + File.separator + "tableTemplate";
        }
        // 表级模板
        List<Template> tableTemplates = TemplateUtil.getTemplateList(tableTemplatePath);
        String columnTemplatePath = path.getColumnTemplatePath();
        if (!StringUtils.hasLength(columnTemplatePath)){
            columnTemplatePath = path.getBaseTemplatePath() + File.separator + "columnTemplate";
        }
        // 列级模板
        List<Template> columnTemplates = TemplateUtil.getTemplateList(columnTemplatePath);
        String projectTemplatePath = path.getProjectTemplatePath();
        if (!StringUtils.hasLength(projectTemplatePath)){
            projectTemplatePath = path.getBaseTemplatePath() + File.separator + "projectTemplate";
        }
        // 项目级模板
        List<Template> projectTemplates = TemplateUtil.getTemplateList(projectTemplatePath);
        // 循环所有项目级别模板
        for (Template t : projectTemplates) {
            System.out.println("处理模板：" + t.getRelativePath());

            // 如果是模板类文件
            if (FileUtil.isTemplateFile(t.getName())) {

                // 读取项目级别模板文件内容  替换表级模板部分
                String newTemplateContent = TemplateUtil.replaceTableContent(t.getContent(), tableTemplates, tables);

                // 如果文件名包含表替换符号则循环输出
                if (t.getName().contains(Placeholder.TABLE_LOWER) || t.getName().contains(Placeholder.TABLE_UPPER)) {
                    for (Table table : tables) {
                        // 得到模板内容
                        String outContent = newTemplateContent;

                        // 替换列级模板部分
                        outContent = TemplateUtil.replaceColumnContent(outContent, columnTemplates, table);

                        // 全局替换符嵌套替换符处理********
                        System.out.println("***全局替换符嵌套替换符处理***" + table.getName());
                        // 全局替换
                        outContent = TemplateUtil.replaceGlobalContent(outContent, path, project, database);
                        //表名使用驼峰命名,下划线后面转大写
                        String tableName = FileUtil.getCamelName(table.getName());
                        outContent = outContent.replace(Placeholder.TABLE_NAME,table.getName())
                                .replace(Placeholder.TABLE_LOWER, tableName).replace(Placeholder.TABLE_UPPER, FileUtil.getClassName(tableName));

                        // 输出的路径(经过全局替换)
                        String outPath = TemplateUtil.replaceGlobalContent(path.getCodeGeneratorPath() + File.separator + t.getRelativePath(), path, project, database);
                        // 在新的文件中去掉模板文件标记***********(myself)
                        outPath = outPath.replace("(myself)", "")
                                .replace(Placeholder.TABLE_LOWER, tableName).replace(Placeholder.TABLE_UPPER, FileUtil.getClassName(tableName));
                        System.out.println("生成代码: " + outPath);
                        // 写入文件
                        FileUtil.setContent(outPath, outContent);
                    }
                } else {// 不用循环的文件
                    String outPath = TemplateUtil.replaceGlobalContent(path.getCodeGeneratorPath() + File.separator + t.getRelativePath(), path, project, database);
                    // 在新的文件中去掉模板文件标记***********(myself)
                    outPath = outPath.replace("(myself)", "");
                    System.out.println("生成代码: " + outPath);
                    newTemplateContent = TemplateUtil.replaceGlobalContent(newTemplateContent, path, project, database);
                    // 写入文件
                    FileUtil.setContent(outPath, newTemplateContent);
                }
            } else {// 非模板文件直接拷贝
                String newPath = TemplateUtil.replaceGlobalContent(path.getCodeGeneratorPath() + File.separator + t.getRelativePath(), path, project, database);

                try {
                    FileUtil.copyFile(new File(t.getAbsolutePath()), new File(newPath));
                } catch (IOException e) {
                    System.err.println("复制文件" + t.getName() + "失败" + e.getMessage());
                }
            }
        }
        System.out.println("代码成功生成!");
    }
}
